package ar.edu.unq.persistencia.gpilla.operaciones;

import java.util.ArrayList;
import java.util.Random;

import org.hibernate.Session;

import ar.edu.unq.persistencia.gpilla.Equipo;
import ar.edu.unq.persistencia.gpilla.Formacion;
import ar.edu.unq.persistencia.gpilla.Formacion343;
import ar.edu.unq.persistencia.gpilla.Formacion442;
import ar.edu.unq.persistencia.gpilla.FormacionStrategy;
import ar.edu.unq.persistencia.gpilla.HabilidadImpl;
import ar.edu.unq.persistencia.gpilla.Jugador;
import ar.edu.unq.persistencia.gpilla.PartidoDeCopa;
import ar.edu.unq.persistencia.gpilla.PartidoSimple;
import ar.edu.unq.persistencia.gpilla.Posicion;
import ar.edu.unq.persistencia.gpilla.Tecnico;
import ar.edu.unq.persistencia.gpilla.exceptions.PartidoDeCopaEmpatadoException;
import ar.edu.unq.persistencia.gpilla.hibernate.SessionManager;

/**
 * TODO: description
 */
public class CrearCampeonato implements Operacion<Boolean> {

    @Override
    public Boolean ejecutar() {
        ArrayList<Equipo> equipos = new ArrayList<Equipo>();
        for (int i = 1; i <= 20; i++) {
            equipos.add(crearEquipo(i));
        }

        for (Equipo local : equipos) {
            for (Equipo visita : equipos) {
                if (local != visita) {
                    System.out.println("> Juega " + local.getNombre() + " vs " + visita.getNombre());
                    crearPartidoDeCopa(local, visita);
                }
            }
        }
        return true;

    }

    private static void crearPartidoDeCopa(final Equipo local, final Equipo visita) {
        PartidoDeCopa partidoDeCopa = new PartidoDeCopa();

        partidoDeCopa.setPartidoIda(new PartidoSimple(local, visita, new Random().nextInt(6), new Random().nextInt(6)));
        partidoDeCopa.setPartidoVuelta(new PartidoSimple(visita, local, new Random().nextInt(6), new Random()
                .nextInt(6)));

        Equipo equipoGanador;
        try {
            equipoGanador = partidoDeCopa.getGanador();
        } catch (PartidoDeCopaEmpatadoException e) {
            Integer ronda = 0;
            partidoDeCopa.setPenalesEquipoUno(0);
            partidoDeCopa.setPenalesEquipoDos(0);
            // / UN DESEMPATE JUSTO!!!!
            while (ronda < 5 || partidoDeCopa.getPenalesEquipoUno() == partidoDeCopa.getPenalesEquipoDos()) {
                if (new Random().nextInt(5) > 0) {
                    partidoDeCopa.setPenalesEquipoUno(partidoDeCopa.getPenalesEquipoUno() + 1);
                }
                if (new Random().nextInt(5) > 0) {
                    partidoDeCopa.setPenalesEquipoDos(partidoDeCopa.getPenalesEquipoDos() + 1);
                }
                ronda++;
            }
            equipoGanador = partidoDeCopa.getGanador();

        }

        Session session = SessionManager.getInstancia().getSession();

        session.saveOrUpdate(partidoDeCopa);

    }

    private static Equipo crearEquipo(final int id) {
        Equipo equipo = new Equipo();

        equipo.setNombre("Equipo " + id);

        equipo.setTecnico(new Tecnico("El DT de " + equipo.getNombre(), crearFormacion()));

        // Creo los 16 jugadores
        for (int i = 1; i <= 16; i++) {
            equipo.agregarJugador(crearJugador(i));
        }

        Formacion formacion = equipo.armarFormacion();

        Session session = SessionManager.getInstancia().getSession();
        session.saveOrUpdate(equipo);
        session.saveOrUpdate(formacion);

        return equipo;
    }

    private static FormacionStrategy crearFormacion() {
        if (new Random().nextInt(1) == 1) {
            return new Formacion343();
        } else {
            return new Formacion442();
        }
    }

    private static Jugador crearJugador(final Integer i) {
        Jugador jugador = new Jugador();
        String nombre = "Jugador" + i;
        jugador.setNombre(nombre);
        Posicion[] posiciones = Posicion.values();
        // Se agregan las 8 habilidades, con un random sobre la capacidades que tiene.
        for (int j = 0; j < 8; j++) {
            jugador.addHabilidad(new HabilidadImpl(posiciones[j], new Random().nextInt(10)));
        }
        System.out.println("> Se creo el jugador " + nombre);
        return jugador;
    }
}
